home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / gui / ClassFree_src.lha / ClassFree_src / CFgroupgclass / class.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-31  |  4.1 KB  |  189 lines

  1. /* Sample class  for StormC*/
  2.  
  3. #include <clib/alib_protos.h>
  4. #include <proto/intuition.h>
  5. #include <exec/libraries.h>
  6. #include <intuition/classes.h>
  7. #include <intuition/gadgetclass.h>
  8. #include <dos/dos.h>
  9. #include "class.h"
  10. #include "CFgroupg.h"
  11. #ifdef DEBUG
  12.  #include "debug_protos.h"
  13.  extern APTR console;
  14. #endif
  15.  
  16. Class *initclass(struct classbase *base)
  17. {
  18.   Class *cl;
  19.  
  20.   if(cl = MakeClass(CFgroupgClassName,GADGETCLASS,NULL,
  21.         sizeof(struct objectdata),NULL))
  22.   {
  23.     cl->cl_Dispatcher.h_Entry = hookEntry;
  24.     cl->cl_Dispatcher.h_SubEntry = dispatcher;
  25.     AddClass(cl);
  26.   }
  27.   base->cl = cl;
  28.  
  29.   return(cl);
  30. }
  31.  
  32. BOOL removeclass(struct classbase *base)
  33. {
  34.   BOOL result;
  35.  
  36.   if(result = FreeClass(base->cl)) base->cl = NULL;
  37.  
  38.   return(result);
  39. }
  40.  
  41. ULONG dispatcher(Class *cl,Object *o,Msg msg)
  42. {
  43.   switch(msg->MethodID)
  44.   {
  45.     case OM_NEW:
  46.       return(newobject(cl,o,msg));
  47.     case OM_DISPOSE:
  48.       return(dispose(cl,o));
  49.     case OM_ADDMEMBER:
  50.       return(addmember(cl,o,msg));
  51.     case OM_REMMEMBER:
  52.       return(remmember(cl,o,msg));
  53.     case GM_HITTEST:
  54.       return(hittest(cl,o,msg));
  55.     case GM_GOACTIVE:
  56.     case GM_HANDLEINPUT:
  57.       return(handleinput(cl,o,msg));
  58.     case GM_GOINACTIVE:
  59.       return(goinactive(cl,o,msg));
  60.     case GM_RENDER:
  61.       return(render(cl,o,msg));
  62.     default:
  63.       return(DoSuperMethodA(cl,o,msg));
  64.   }
  65. }
  66.  
  67. ULONG newobject(Class *cl,Object *o,Msg msg)
  68. {
  69.   struct Gadget *gad;
  70.   struct objectdata *dt;
  71.   struct List *list;
  72.   ULONG obj;
  73.  
  74.   if(obj = DoSuperMethodA(cl,o,msg))
  75.   {
  76.     gad = (struct Gadget *)obj;
  77.     dt = (struct objectdata *)INST_DATA(cl,obj);
  78.     list = (struct List *)dt;
  79.  
  80.     NewList(list);
  81.     dt->act = 0;
  82.     gad->Width = 0; gad->Height = 0;
  83.     return(obj);
  84.   }
  85.   return(NULL);
  86. }
  87.  
  88. ULONG dispose(Class *cl,Object *o)
  89. {
  90.   struct List *list = INST_DATA(cl,o);
  91.   APTR lp = list->lh_Head;
  92.   Object *obj;
  93.  
  94.   while(obj = NextObject(&lp))
  95.   {
  96.     DoMethod(obj,OM_REMOVE);
  97.     DoMethod(obj,OM_DISPOSE);
  98.   }
  99.  
  100.   DoSuperMethod(cl,o,OM_DISPOSE);
  101.   return(NULL);
  102. }
  103.  
  104. ULONG addmember(Class *cl,Object *o,Msg msg)
  105. {
  106.   struct opMember *opm = (struct opMember *)msg;
  107.   struct opAddTail add;
  108.   struct Gadget *gad = (struct Gadget *)opm->opam_Object;
  109.   struct Gadget *ggad =(struct Gadget *)o;
  110.   WORD gx = gad->LeftEdge+gad->Width-1,gy = gad->TopEdge+gad->Height-1;
  111.  
  112.   add.MethodID = OM_ADDTAIL;
  113.   add.opat_List = INST_DATA(cl,o);
  114.   if(ggad->Width<gx) ggad->Width = gx;
  115.   if(ggad->Height<gy) ggad->Height = gy;
  116.   gad->LeftEdge += ggad->LeftEdge;
  117.   gad->TopEdge += ggad->TopEdge;
  118.   DoMethodA(opm->opam_Object,(Msg)&opm);
  119.   return(1);
  120. }
  121.  
  122. ULONG remmember(Class *cl,Object *o,Msg msg)
  123. {
  124.   struct opMember *opm = (struct opMember *)msg;
  125.  
  126.   DoMethod(opm->opam_Object,OM_REMOVE);
  127.   return(1);
  128. }
  129.  
  130.  
  131. ULONG hittest(Class *cl,Object *o,Msg msg)
  132. {
  133.   struct gpHitTest *test = (struct gpHitTest *)msg;
  134.   struct Gadget *gad,*ggad = (struct Gadget *)o;
  135.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  136.   struct List *list = (struct List *)dt;
  137.   WORD x = test->gpht_Mouse.X ,y = test->gpht_Mouse.Y;
  138.   ULONG result;
  139.   APTR lp = list->lh_Head;
  140.  
  141.   while(gad = (struct Gadget *)NextObject(&lp)) /* Simple really.. :) */
  142.   {
  143.     test->gpht_Mouse.X = x-(gad->LeftEdge-ggad->LeftEdge);
  144.     test->gpht_Mouse.Y = y-(gad->TopEdge-ggad->TopEdge);
  145.     if(result = DoMethodA((Object *)gad,msg))
  146.     {
  147.       dt->act = gad;
  148.       return(result);
  149.     }
  150.   }
  151.  
  152.   return(NULL);
  153. }
  154.  
  155. ULONG handleinput(Class *cl,Object *o,Msg msg)
  156. {
  157.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  158.   struct gpInput *in = (struct gpInput *)msg;
  159.   struct Gadget *ggad = (struct Gadget *)o;
  160.  
  161.   in->gpi_Mouse.X -= dt->act->LeftEdge-ggad->LeftEdge;
  162.   in->gpi_Mouse.Y -= dt->act->TopEdge-ggad->TopEdge;
  163.   return(DoMethodA((Object *)dt->act,msg));
  164. }
  165.  
  166.  
  167. ULONG goinactive(Class *cl,Object *o,Msg msg)
  168. {
  169.   struct objectdata *dt = (struct objectdata *)INST_DATA(cl,o);
  170.   ULONG result;
  171.  
  172.   result = DoMethodA((Object *)dt->act,msg);
  173.   dt->act = NULL;
  174.   return(result);
  175. }
  176.  
  177.  
  178. ULONG render(Class *cl,Object *o,Msg msg)
  179. {
  180.   struct List *list = (struct List *)INST_DATA(cl,o);
  181.   Object *obj;
  182.   APTR lp = list->lh_Head;
  183.  
  184.   while(obj = NextObject(&lp)) DoMethodA(obj,msg);
  185.  
  186.   return(1);
  187. }
  188.  
  189.